Conjuntos, relaciones y funciones

Como ya hemos visto, las listas en gap se denotan como una secuencia entre corchetes. La función Set convierte una lista en un conjunto, y por tanto, entre otras cosas, elimina instancias repetidas de elementos. Las operaciones básicas de conjuntos son las siguientes.

a:=Set([1,2,3]);
[ 1, 2, 3 ]
b:=Set([2,4,5,6]);
[ 2, 4, 5, 6 ]
Union(a,b);
[ 1, 2, 3, 4, 5, 6 ]
Intersection(a,b);
[ 2 ]
Difference(a,b);
[ 1, 3 ]
Difference(b,a);
[ 4, 5, 6 ]

Una relación de equivalencia se puede definir de varias formas. Veamos algunas de ellas. Lo primero que tenemos que declarar es un dominio en el que trabajar.

a:=Domain(Set([1..20]));
<object>

Podemos entonces definir por ejemplo una relación usando una partición de dicho dominio.

r:=EquivalenceRelationByPartition(a,[[1..10],[11..20]]);
<object>

Y luego ver cuáles son las clases de equivalencia, o comprobar si dos elementos están o no relacionados.

List(EquivalenceClasses(r),Elements);
[ [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], [ 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ] ]
EquivalenceClassOfElement(r,2)=EquivalenceClassOfElement(r,3);
true

También podemos definir una relación de equivalencia como la menor que contenga un conjunto de parejas.

r:=EquivalenceRelationByPairs(a,[[1,2],[3,4]]);
<object>
List(EquivalenceClasses(r),Elements);
[ [ 1, 2 ], [ 3, 4 ], [ 5 ], [ 6 ], [ 7 ], [ 8 ], [ 9 ], [ 10 ], [ 11 ], [ 12 ], [ 13 ], [ 14 ], [ 15 ], [ 16 ], [ 17 ], [ 18 ], [ 19 ], [ 20 ] ]
EquivalenceClassOfElement(r,2)=EquivalenceClassOfElement(r,3);
false

Las funciones también se pueden definir usando reglas. Veamos algunos ejemplos.

a:=Domain([-2..2]);
<object>
b:=Domain([-5..5]);
<object>
 f:=MappingByFunction(a,b,x->x^2);
<object>
IsInjective(f);
false
IsSurjective(f);
false

Calcular la imagen de f, o bien la de un subconjunto del dominio.

Image(f);
[ 0, 1, 4 ]
Image(f,1);
1
Image(f,[0,2]);
[ 0, 4 ]

Y lo mismo con preimágenes o imágenes inversas.

PreImages(f,2);
[  ]
PreImages(f,1);
[ -1, 1 ]
PreImages(f,[1,4]);
[ -2, -1, 1, 2 ]